package main

import (
	"context"
	"flag"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"path/filepath"
	"syscall"
	"time"

	"baseService/internal/application"
	"baseService/internal/global"
	"baseService/internal/routes"

	"github.com/gin-gonic/gin"
)

func main() {
	// 解析命令行参数
	var configPath string
	flag.StringVar(&configPath, "config", "./config", "配置文件路径")
	flag.Parse()

	// 转换为绝对路径
	absConfigPath, err := filepath.Abs(configPath)
	if err != nil {
		log.Fatalf("获取配置路径失败: %v", err)
	}

	// 初始化全局组件 - 一行搞定！
	if err := global.Init(absConfigPath); err != nil {
		log.Fatalf("初始化失败: %v", err)
	}
	defer global.Close()

	// 基于全局初始化创建应用上下文
	appCtx, err := application.NewAppContext()
	if err != nil {
		log.Fatalf("构建应用上下文失败: %v", err)
	}

	// 设置Gin模式
	if appCtx.IsProduction() {
		gin.SetMode(gin.ReleaseMode)
	}

	// 创建Gin引擎
	router := gin.New()

	// 设置路由 - 显式传入上下文
	routeManager := routes.NewRouter(appCtx)
	if err := routeManager.Setup(router); err != nil {
		log.Fatalf("设置路由失败: %v", err)
	}

	// 创建HTTP服务器
	server := &http.Server{
		Addr:         fmt.Sprintf("%s:%d", appCtx.Config.Server.Host, appCtx.Config.Server.Port),
		Handler:      router,
		ReadTimeout:  appCtx.Config.Server.ReadTimeout,
		WriteTimeout: appCtx.Config.Server.WriteTimeout,
		IdleTimeout:  appCtx.Config.Server.IdleTimeout,
	}

	// 启动服务器
	go func() {
		appCtx.Logger.Infof("服务器启动在 %s", server.Addr)
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("服务器启动失败: %v", err)
		}
	}()

	// 等待中断信号
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit

	appCtx.Logger.Info("收到关闭信号，开始优雅关闭...")

	// 优雅关闭（30秒超时）
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	if err := server.Shutdown(ctx); err != nil {
		appCtx.Logger.Errorf("服务器关闭失败: %v", err)
	}

	appCtx.Logger.Info("服务器已关闭")
}
